The present invention relates to non-volatile memory such as NAND Flash memory, and more particularly, this invention relates to advanced management of non-volatile memory blocks.
Using Flash memory as an example, the residual bit error rate (RBER) of a Flash memory block will typically increase over time due to additional program and erase cycling, retention, charge leakage from retention, and additional charge placed in the cells by read operations (i.e., read disturb errors). Typically, a Flash memory block is retired when any page in the block exhibits a code word that reaches a page retirement error count limit. This limit is typically set to be achieved in conjunction with an appropriate error correction code (ECC), with the RBER for a Flash memory block being set to be similar to the RBER in traditional hard disk drives, e.g., at around 10×10−15, but may be more or less.
Threshold voltage shifting, also known as block calibration, has been shown to be a key contributor to enhance endurance and retention for enterprise-level Flash memory systems using 19 nm and sub-19 nm NAND Flash memory. Preferably, the optimal threshold voltage shift values are determined shortly after a Flash memory block has been written. Unfortunately, this is not possible under a sustained heavy write workload without impacting data path performance. After initial writing, the threshold voltage shift values should be updated periodically as long as data remains on the Flash memory blocks. However, this would require significant additional read workload and data processing for every Flash memory block written, which is not acceptable in a Flash memory system.
Therefore, block calibrations are preferably executed at low frequency in the background and not in the data path, e.g., due to additional read operations and data processing which would otherwise be required. However, prior attempts to achieve such functionality have been unsuccessful because background calibration of a block may not always be executed at any time, e.g., when a block is not yet programmed after an erase operation.